1 2 /* Simple program: Create a blank window, wait for keypress, quit. 3 4 Please see the SDL documentation for details on using the SDL API: 5 /Developer/Documentation/SDL/docs.html 6 */ 7 8 #include <stdio.h> 9 #include <stdlib.h> 10 #include <string.h> 11 #include <math.h> 12 13 #include "SDL.h" 14 15 extern void Atlantis_Init (); 16 extern void Atlantis_Reshape (int w, int h); 17 extern void Atlantis_Animate (); 18 extern void Atlantis_Display (); 19 20 static SDL_Surface *gScreen; 21 22 static void initAttributes () 23 { 24 // Setup attributes we want for the OpenGL context 25 26 int value; 27 28 // Don't set color bit sizes (SDL_GL_RED_SIZE, etc) 29 // Mac OS X will always use 8-8-8-8 ARGB for 32-bit screens and 30 // 5-5-5 RGB for 16-bit screens 31 32 // Request a 16-bit depth buffer (without this, there is no depth buffer) 33 value = 16; 34 SDL_GL_SetAttribute (SDL_GL_DEPTH_SIZE, value); 35 36 37 // Request double-buffered OpenGL 38 // The fact that windows are double-buffered on Mac OS X has no effect 39 // on OpenGL double buffering. 40 value = 1; 41 SDL_GL_SetAttribute (SDL_GL_DOUBLEBUFFER, value); 42 } 43 44 static void printAttributes () 45 { 46 // Print out attributes of the context we created 47 int nAttr; 48 int i; 49 50 int attr[] = { SDL_GL_RED_SIZE, SDL_GL_BLUE_SIZE, SDL_GL_GREEN_SIZE, 51 SDL_GL_ALPHA_SIZE, SDL_GL_BUFFER_SIZE, SDL_GL_DEPTH_SIZE }; 52 53 char *desc[] = { "Red size: %d bits\n", "Blue size: %d bits\n", "Green size: %d bits\n", 54 "Alpha size: %d bits\n", "Color buffer size: %d bits\n", 55 "Depth bufer size: %d bits\n" }; 56 57 nAttr = sizeof(attr) / sizeof(int); 58 59 for (i = 0; i < nAttr; i++) { 60 61 int value; 62 SDL_GL_GetAttribute (attr[i], &value); 63 printf (desc[i], value); 64 } 65 } 66 67 static void createSurface (int fullscreen) 68 { 69 Uint32 flags = 0; 70 71 flags = SDL_OPENGL; 72 if (fullscreen) 73 flags |= SDL_FULLSCREEN; 74 75 // Create window 76 gScreen = SDL_SetVideoMode (640, 480, 0, flags); 77 if (gScreen == NULL) { 78 79 fprintf (stderr, "Couldn't set 640x480 OpenGL video mode: %s\n", 80 SDL_GetError()); 81 SDL_Quit(); 82 exit(2); 83 } 84 } 85 86 static void initGL () 87 { 88 Atlantis_Init (); 89 Atlantis_Reshape (gScreen->w, gScreen->h); 90 } 91 92 static void drawGL () 93 { 94 Atlantis_Animate (); 95 Atlantis_Display (); 96 } 97 98 static void mainLoop () 99 { 100 SDL_Event event; 101 int done = 0; 102 int fps = 24; 103 int delay = 1000/fps; 104 int thenTicks = -1; 105 int nowTicks; 106 107 while ( !done ) { 108 109 /* Check for events */ 110 while ( SDL_PollEvent (&event) ) { 111 switch (event.type) { 112 113 case SDL_MOUSEMOTION: 114 break; 115 case SDL_MOUSEBUTTONDOWN: 116 break; 117 case SDL_KEYDOWN: 118 /* Any keypress quits the app... */ 119 case SDL_QUIT: 120 done = 1; 121 break; 122 default: 123 break; 124 } 125 } 126 127 // Draw at 24 hz 128 // This approach is not normally recommended - it is better to 129 // use time-based animation and run as fast as possible 130 drawGL (); 131 SDL_GL_SwapBuffers (); 132 133 // Time how long each draw-swap-delay cycle takes 134 // and adjust delay to get closer to target framerate 135 if (thenTicks > 0) { 136 nowTicks = SDL_GetTicks (); 137 delay += (1000/fps - (nowTicks-thenTicks)); 138 thenTicks = nowTicks; 139 if (delay < 0) 140 delay = 1000/fps; 141 } 142 else { 143 thenTicks = SDL_GetTicks (); 144 } 145 146 SDL_Delay (delay); 147 } 148 } 149 150 int main(int argc, char *argv[]) 151 { 152 // Init SDL video subsystem 153 if ( SDL_Init (SDL_INIT_VIDEO) < 0 ) { 154 155 fprintf(stderr, "Couldn't initialize SDL: %s\n", 156 SDL_GetError()); 157 exit(1); 158 } 159 160 // Set GL context attributes 161 initAttributes (); 162 163 // Create GL context 164 createSurface (0); 165 166 // Get GL context attributes 167 printAttributes (); 168 169 // Init GL state 170 initGL (); 171 172 // Draw, get events... 173 mainLoop (); 174 175 // Cleanup 176 SDL_Quit(); 177 178 return 0; 179 } 180